﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using EvaluacionExalmarOledbHelper;
using EvaluacionExalmarEntidades;
using EvaluacionExalmarInterfaces;
using System.Configuration;
using System.Text;

namespace EvaluacionExalmarAccesoDatos
{
    public class Evaluacion : IEvaluacion
    {
        #region IEvaluacion Members

        private readonly String _sCadenaConexion = ConfigurationManager.ConnectionStrings["con"].ConnectionString;

        public IList<EvaluacionInfo> Listar(EvaluacionInfo oEvaluacion)
        {
            var query = new StringBuilder("SELECT Id, Id_Empleado, Nombre, Apellido_Paterno, Apellido_Materno, Id_Empleado_Evaluado, Nombre_Evaluado, Ape_Pat_Evaluado, " +
                                          "Ape_Mat_Evaluado, Fecha_Evaluacion, ComentariosC1, ComentariosC2, ComentariosC3, ComentariosC4, ComentariosC5, " +
                                          "ActividadesC1, ActividadesC2, ActividadesC3, ActividadesC4, ActividadesC5, ComentariosC6, ActividadesC6 From ConsultaEvaluacionC ");
            if (oEvaluacion != null)
            {
                var where = new StringBuilder(" where ");
                if (oEvaluacion.IdEvaluacion.HasValue)
                {
                    where.Append(" Id = " + oEvaluacion.IdEvaluacion);
                }

                if (oEvaluacion.IdEmpleado.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append("Id_Empleado = " + oEvaluacion.IdEmpleado);
                }

                if (oEvaluacion.IdEmpleadoEvaluado.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append("Id_Empleado_Evaluado = " + oEvaluacion.IdEmpleadoEvaluado);
                }

                query.Append(@where);
            }
            var oListaEvaluacion = new List<EvaluacionInfo>();

            using (var drd = OleDbHelper.ExecuteReader(_sCadenaConexion, CommandType.Text, query.ToString()))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oListaEvaluacion.Add(new EvaluacionInfo(drd.GetInt32(0), 
                                drd.GetInt32(1), new EmpleadoInfo(drd.GetInt32(1), drd.GetString(2).Trim(), drd.GetString(3).Trim(), drd.GetString(4).Trim(), null, null, null, null, null), 
                                drd.GetInt32(5), new EmpleadoInfo(drd.GetInt32(6), drd.GetString(7).Trim(), drd.GetString(8).Trim(), drd.GetString(9).Trim(), null, null, null, null, null), 
                                drd.GetDateTime(10), drd.GetString(11).Trim(), drd.GetString(12).Trim(), drd.GetString(13).Trim(), drd.GetString(14).Trim(), drd.GetString(15).Trim(), 
                                drd.GetString(16).Trim(), drd.GetString(17).Trim(), drd.GetString(18).Trim(), drd.GetString(19).Trim(), drd.GetString(20).Trim(), null,
                                drd.GetString(21).Trim(), drd.GetString(22).Trim()));
                        }
                    }
                }
            }

            return oListaEvaluacion;
        }

        public EvaluacionInfo Consultar(EvaluacionInfo oEvaluacion)
        {
            var query = new StringBuilder("SELECT Id, Id_Empleado, Nombre, Apellido_Paterno, Apellido_Materno, Id_Empleado_Evaluado, Nombre_Evaluado, Ape_Pat_Evaluado, " +
                                          "Ape_Mat_Evaluado, Fecha_Evaluacion, ComentariosC1, ComentariosC2, ComentariosC3, ComentariosC4, ComentariosC5, " +
                                          "ActividadesC1, ActividadesC2, ActividadesC3, ActividadesC4, ActividadesC5 From ConsultaEvaluacionC ");
            if (oEvaluacion != null)
            {
                var where = new StringBuilder(" where ");
                if (oEvaluacion.IdEvaluacion.HasValue)
                {
                    where.Append(" Id = " + oEvaluacion.IdEvaluacion);
                }

                if (oEvaluacion.IdEmpleado.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append("Id_Empleado = " + oEvaluacion.IdEmpleado);
                }

                if (oEvaluacion.IdEmpleadoEvaluado.HasValue)
                {
                    if (!where.ToString().Equals(" where "))
                        where.Append(" and ");
                    where.Append("Id_Empleado_Evaluado = " + oEvaluacion.IdEmpleadoEvaluado);
                }

                query.Append(@where);
            }
            var oEntEvaluacion = new EvaluacionInfo();

            using (var drd = OleDbHelper.ExecuteReader(_sCadenaConexion, CommandType.Text, query.ToString()))
            {
                if (drd != null)
                {
                    if (drd.HasRows)
                    {
                        while (drd.Read())
                        {
                            oEntEvaluacion = new EvaluacionInfo(drd.GetInt32(0),
                                drd.GetInt32(1), new EmpleadoInfo(drd.GetInt32(1), drd.GetString(2).Trim(), drd.GetString(3).Trim(), drd.GetString(4).Trim(), null, null, null, null, null),
                                drd.GetInt32(5), new EmpleadoInfo(drd.GetInt32(6), drd.GetString(7).Trim(), drd.GetString(8).Trim(), drd.GetString(9).Trim(), null, null, null, null, null),
                                drd.GetDateTime(10), drd.GetString(11).Trim(), drd.GetString(12).Trim(), drd.GetString(13).Trim(), drd.GetString(14).Trim(), drd.GetString(15).Trim(),
                                drd.GetString(16).Trim(), drd.GetString(17).Trim(), drd.GetString(18).Trim(), drd.GetString(19).Trim(), drd.GetString(20).Trim(), null,
                                drd.GetString(21).Trim(), drd.GetString(22).Trim());
                        }
                    }
                }
            }

            return oEntEvaluacion;
        }

        public bool Registrar(EvaluacionInfo oEvaluacion, ref int? nId)
        {
            var bExito = false;
            var oledbParm = new OleDbParameter[15];
            const String query = "Insert into Evaluacion (Id_Empleado, Id_Empleado_Evaluado, Fecha_Evaluacion, ComentariosC1, ComentariosC2, ComentariosC3, " +
                                 "ComentariosC4, ComentariosC5, ActividadesC1, ActividadesC2, ActividadesC3, ActividadesC4, ActividadesC5, ComentariosC6, ActividadesC6) " +
                                 "Values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

            using (var oledbcon = new OleDbConnection(_sCadenaConexion))
            {
                oledbcon.Open();
                var oledbtran = oledbcon.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    oledbParm[0] = new OleDbParameter("@Id_Empleado", OleDbType.Integer) { Value = oEvaluacion.IdEmpleado };
                    oledbParm[1] = new OleDbParameter("@Id_Empleado_Evaluado", OleDbType.Integer) { Value = oEvaluacion.IdEmpleadoEvaluado };
                    oledbParm[2] = new OleDbParameter("@Fecha_Evaluacion", OleDbType.Date) { Value = oEvaluacion.FechaEvaluacion };
                    oledbParm[3] = new OleDbParameter("@ComentariosC1", OleDbType.VarChar) { Value = oEvaluacion.ComentariosC1 };
                    oledbParm[4] = new OleDbParameter("@ComentariosC2", OleDbType.VarChar) { Value = oEvaluacion.ComentariosC2 };
                    oledbParm[5] = new OleDbParameter("@ComentariosC3", OleDbType.VarChar) { Value = oEvaluacion.ComentariosC3 };
                    oledbParm[6] = new OleDbParameter("@ComentariosC4", OleDbType.VarChar) { Value = oEvaluacion.ComentariosC4 };
                    oledbParm[7] = new OleDbParameter("@ComentariosC5", OleDbType.VarChar) { Value = oEvaluacion.ComentariosC5 };
                    oledbParm[8] = new OleDbParameter("@ActividadesC1", OleDbType.VarChar) { Value = oEvaluacion.ActividadesC1 };
                    oledbParm[9] = new OleDbParameter("@ActividadesC2", OleDbType.VarChar) { Value = oEvaluacion.ActividadesC2 };
                    oledbParm[10] = new OleDbParameter("@ActividadesC3", OleDbType.VarChar) { Value = oEvaluacion.ActividadesC3 };
                    oledbParm[11] = new OleDbParameter("@ActividadesC4", OleDbType.VarChar) { Value = oEvaluacion.ActividadesC4 };
                    oledbParm[12] = new OleDbParameter("@ActividadesC5", OleDbType.VarChar) { Value = oEvaluacion.ActividadesC5 };
                    oledbParm[13] = new OleDbParameter("@ComentariosC6", OleDbType.VarChar) { Value = oEvaluacion.ComentariosC6 };
                    oledbParm[14] = new OleDbParameter("@ActividadesC6", OleDbType.VarChar) { Value = oEvaluacion.ActividadesC6 };

                    OleDbHelper.ExecuteNonQuery(oledbtran, CommandType.Text, query, oledbParm);

                    const String queryId = "Select @@IDENTITY";
                    using (var drd = OleDbHelper.ExecuteReader(oledbtran, CommandType.Text, queryId))
                    {
                        if (drd != null)
                        {
                            if (drd.HasRows)
                            {
                                drd.Read();
                                oEvaluacion.IdEvaluacion = Int32.Parse(drd.GetValue(0).ToString());
                            }
                        }
                    }

                    if (oEvaluacion.IdEvaluacion.HasValue)
                    {
                        var oDetalleAd = new EvaluacionDetalle();
                        foreach (var detalle in oEvaluacion.Detalle)
                        {
                            detalle.IdEvaluacion = oEvaluacion.IdEvaluacion;

                            if (!oDetalleAd.Registrar(detalle, oledbtran))
                                break;
                            bExito = true;
                        }

                        if (bExito)
                            oledbtran.Commit();
                        else
                            oledbtran.Rollback();

                        nId = oEvaluacion.IdEvaluacion;
                    }


                }
                catch (Exception)
                {
                    oledbtran.Rollback();
                    bExito = false;
                }
                finally
                {
                    oledbcon.Close();
                }
            }

            return bExito;
        }

        public bool Eliminar(EvaluacionInfo oEvaluacion)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
